package com.itheima.rabbitmq.simple;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * @author : [chenxys]
 * @version : [v1.0]
 * @Description : 生产者 简单模式
 * @createTime : [2022/6/22 18:11]
 */
public class Producer {
    /**
     * 队列名称
     * QUEUE_NAME
     */
    public static final String QUEUE_NAME = "simple_queue";

    /**
     * 简单模式 生产者发送消息
     */
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1、创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        // 2、设置参数
        // 2.1、设置IP，默认为127.0.0.1
        factory.setHost("127.0.0.1");
        // 2.2、设置端口，默认为5672
        factory.setPort(5672);
        // 2.3、设置虚拟机,默认为/
        factory.setVirtualHost("/itcast");
        // 2.4、设置用户名,默认为guest
        factory.setUsername("heima");
        // 2.5、设置密码,默认为guest
        factory.setPassword("heima");

        // 3、创建连接 Connection
        Connection connection = factory.newConnection();

        // 4、创建channel
        Channel channel = connection.createChannel();

        // 5、创建队列
        /* queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
*                       队列名称       是否持久化          是否独占本次连接    是否在不使用的时候自动删除队列         队列其它参数
        * 1、queue：队列名称
        * 2、durable：是否持久化[当mq重启后,仍然存在]
        * 3、exclusive：一般设置为 false
        *       * 是否独占：只能有一个消费者监听该条队列
        *       * 当Connection关闭时，是否删除队列
        * 4、autoDelete：是否自动删除。当没有Consumer时,自动删除
        * 5、arguments：队列其它参数
        * */
        //如果没有一个名为QUEUE_NAME的队列,则会自动创建该队列,反之则不会
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        // 6、准备要发送的消息
        String massage = "你好,RabbitMQ";

        // 7、发送消息
        /*basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
        *      交换机名称[如果没有则使用默认]  路由key[简单模式可传递队列名称]   消息其他属性  消息内容
        * 1、exchange：交换机[简单模式交换机会使用默认即设置为空]
        * 2、routingKey：路由名称[简单模式下,与队列名称一致即可]
        * 3、props：配置信息
        * 4、body：真实发送的信息数据
        * */
        channel.basicPublish("",QUEUE_NAME,null,massage.getBytes(StandardCharsets.UTF_8));
        System.out.println("已发送消息:" + massage);

        // 8、关闭资源
        channel.close();
        connection.close();
    }
}
